胎嘎侯~
今天的實戰日記與Eloquent: Relationships有關,簡單來說,Eloquent使管理和使用這些關係變得容易,因為資料庫裡的資料表通常是相互關聯的,多種關係連結使資料表不再獨立封閉。
先來實現每個User都有一個Profile的簡單1對1關係。
1.首先,建立Eloquent Model Profile,-m
是同時產生migration的table。
php artisan make:model Profile -m
2.進入profiles table
,在Schema::create
增加兩個欄位:
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('phone');
$table->unsignedBigInteger('user_id');
$table->timestamps();
});
}
進行資料表生成,輸入php artisan migrate
,回到資料庫查看users和profiles這兩個資料表及欄位是否順利生成。
分解Eloquent的1對1關係
3.進入User.php(Model)增加下列方法
public function profile()
{
//每個User都有Profile
return $this->hasOne('App\Profile'); //綁定與Profile的關係(正向)
}
4.進入Profile.php(Model)增加下列方法
class Profile extends Model
{
protected $fillable = [
'phone','user_id',
];
public function user()
{
//Profile屬於User
return $this->belongsTo('App\User'); //綁定與User的關係(逆向)
}
}
}
了解$fillable,同場加映:Mass Assignment
5.建立一個post請求的路由,URI為/user
。
6.從User(Model)中找第4筆數據,存在$user物件。
7.此時將$user所帶的值連結至profile()中,給profile
中的phone
新增一個值。
8.firstOrCreate()->如果找不到,就增加;此為判斷profiles table裡的user_id是否為users table的id,若否就新增該筆,並在'phone'欄位新增00000;在未使用firstOrCreate()時,資料庫會接受到同個使用者重複的多筆修改資料,因此這個限制是為了綁定1對1的關係。
Route::post('/user',function (Request $request ){
$user = User::find(4);
$user->profile()->firstOrCreate(['user_id'=>$user->id],[
'phone'=>'00000'
]);
dd($user->profile);
});
8.我們利用Postman來查看dd($profile)
印出的內容有哪些。
原先user資料表的find(4),成功連結在Profiles中user_id:4,以及phone欄位新增的0000;此外,我們回到資料庫的profile資料表查看。
資料連結成功。
1對1的關係差不多說完了,我們明天見囉!